package DTO;

import java.io.Serializable;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;



/**
 * 
 * Classe représentant un résumé d'une annonce.
 * 
 * @author Valentin Brémond
 * 
 * @version 1.0
 *
 */
public class ResumeAnnonceDTO implements Serializable
{
	/**
	 * Nécessaire pour la sérialisation.
	 * À modifier lors de chaque changement de version.
	 */
	private static final long serialVersionUID = 100L;

	/**
	 * L'ID de l'annonce.
	 */
	private int id;
	
	/**
	 * La date de l'annonce.
	 */
	private Date date;
	
	/**
	 * Le nom de l'annonce.
	 */
	private String titre;
	
	/**
	 * Le département dans lequel se trouve l'annonce.
	 */
	private String departement;
	
	/**
	 * Si c'est une offre d'emploi ou de stage.
	 */
	private boolean emploi_stage;

	/**
	 * Si c'est un objet ou un service.
	 */
	private boolean objet_service;
	
	
	
	// CONSTRUCTEUR
	


	/**
	 * Constructeur par valeurs.
	 * 
	 * @param id L'ID de l'annonce.
	 * @param date Sa date.
	 * @param titre Son titre.
	 * @param departement Son département.
	 * @param emploi_stage Si l'annonce concerne un emploi ou un stage : true ; sinon : false.
	 * @param objet_service Si l'annonce concerne un bien ou un service : true ; sinon : false.
	 */
	public ResumeAnnonceDTO(int id, Date date, String titre, String departement, boolean emploi_stage, boolean objet_service)
	{
		super();
		
		this.id = id;
		this.date = date;
		this.titre = titre;
		this.departement = departement;
		this.emploi_stage = emploi_stage;	
		this.objet_service = objet_service;			
	}
	
	
	
	// MÉTHODES
	
	
	
	/**
	 * Permet de trier une liste de {@link ResumeAnnonceDTO} par date descendante.
	 * 
	 * @param liste La liste d'annonces non triée.
	 * @return La même liste d'annonces, mais triée par date, de la plus récente à la plus ancienne.
	 */
	public static List<ResumeAnnonceDTO> trierParDate(List<ResumeAnnonceDTO> liste)
	{
		// Permettra de stocker l'index
		int max = 0;
		
		// Permettra de stocker la date
		Date date = new Date(0L);
		
		// On copie la liste non triée pour travailler dessus
		List<ResumeAnnonceDTO> liste_non_triee = new ArrayList<ResumeAnnonceDTO>(liste);
		
		// La liste triée
		List<ResumeAnnonceDTO> liste_triee = new ArrayList<ResumeAnnonceDTO>(liste_non_triee.size());
		
		// Tant qu'on n'a pas épuisé la liste non triée, on trie
		while(liste_non_triee.size() > 0)
		{
			// On (re)met l'index à 0
			max = 0;
			
			// Et la date à 0
			date = new Date(0L);
			
			// On cherche l'annonce ayant la date la plus récente
			for(int i = 0 ; i < liste_non_triee.size() ; i++)
			{
				// Si la date est plus récente
				if(liste_non_triee.get(i).getDate().compareTo(date) >= 0)
				{
					// On sauvegarde l'index
					max = i;
					
					// Ainsi que la date
					date = liste_non_triee.get(i).getDate();
				}
			}
			
			// Une fois qu'on l'a trouvée, on la stocke dans la nouvelle liste
			liste_triee.add(liste_non_triee.get(max));
			
			// Et on la supprime de la liste non triée
			liste_non_triee.remove(max);
		}
		
		return liste_triee;
	}
	
	
	
	/**
	 * Permet de trier une liste de {@link ResumeAnnonceDTO} par départements croissants.
	 * 
	 * @param liste La liste d'annonces non triées.
	 * @return La même liste d'annonces, mais triée par département, du plus petit au plus grand.
	 * @throws NumberFormatException Si un des départements de la liste n'est pas bon.
	 */
	public static List<ResumeAnnonceDTO> trierParDepartement(List<ResumeAnnonceDTO> liste) throws NumberFormatException
	{
		// Permettra de stocker l'index
		int min = 0;
				
		// Permettra de stocker le département
		float departement = 1000.0f;
		
		// On copie la liste non triée pour travailler dessus
		List<ResumeAnnonceDTO> liste_non_triee = new ArrayList<ResumeAnnonceDTO>(liste);
		
		// La liste triée
		List<ResumeAnnonceDTO> liste_triee = new ArrayList<ResumeAnnonceDTO>(liste_non_triee.size());
		
		// On fait un premier passage pour remplacer les départements de la Corse (2A et 2B) par des float (20 et 20.5)
		for(ResumeAnnonceDTO r : liste_non_triee)
		{
			if(r.getDepartement().equals("2A"))
			{
				r.setDepartement("20.0");
			}
			else if(r.getDepartement().equals("2B"))
			{
				r.setDepartement("20.5");
			}
		}
		
		// Tant qu'on n'a pas épuisé la liste non triée, on trie
		while(liste_non_triee.size() > 0)
		{
			// On (re)met l'index à 0
			min = 0;
			
			// Et le département à 1000
			departement = 1000.0f;
						
			// On cherche l'annonce ayant le département le plus petit
			for(int i = 0 ; i < liste_non_triee.size() ; i++)
			{
				// Si le département est plus petit
				if(Float.parseFloat(liste_non_triee.get(i).getDepartement()) < departement)
				{
					// On sauvegarde l'index
					min = i;
					
					// Ainsi que le département
					departement = Float.parseFloat(liste_non_triee.get(i).getDepartement());
				}
			}
			
			// Une fois qu'on l'a trouvée, on la stocke dans la nouvelle liste
			liste_triee.add(liste_non_triee.get(min));
			// Et on la supprime de la liste non triée
			liste_non_triee.remove(min);
		}
		
		return liste_triee;
	}
	

	
	// GETTERS ET SETTERS
	
	
	
	public int getId()
	{
		return id;
	}



	public void setId(int id)
	{
		this.id = id;
	}



	public Date getDate()
	{
		return date;
	}



	public void setDate(Date date)
	{
		this.date = date;
	}



	public String getTitre()
	{
		return titre;
	}



	public void setTitre(String titre)
	{
		this.titre = titre;
	}



	public String getDepartement()
	{
		return departement;
	}



	public void setDepartement(String departement)
	{
		this.departement = departement;
	}
	
	
	
	public boolean isEmploi_stage()
	{
		return emploi_stage;
	}



	public void setEmploi_stage(boolean emploi_stage)
	{
		this.emploi_stage = emploi_stage;
	}



	public boolean isObjet_service()
	{
		return objet_service;
	}



	public void setObjet_service(boolean objet_service)
	{
		this.objet_service = objet_service;
	}
}